package com.springcloud.zuul.filter;

import com.entity.ResponseResultSet;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.uitl.JwtUitl;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * @author
 * @create 2020-11-11 19:39
 */
@Component
public class MyZuulFilter extends ZuulFilter {

    //声明拦截器的类型
    /*
      PRE：这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
      ROUTING：这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求，并使用Apache HttpClient或Netfilx Ribbon请求微服务。
      POST：这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。
      ERROR：在其他阶段发生错误时执行该过滤器
    */
    @Override
    public String filterType() {
        return "pre";
    }

    //filter的执行优先级，当有多个filter时数字小的先执行
    @Override
    public int filterOrder() {
        return 0;
    }

    //是否拦截，它如果返回false，则后面的run方法不会执行
    @Override
    public boolean shouldFilter() {
        //模仿用户登录
        //获取上下文环境
//        RequestContext context = RequestContext.getCurrentContext();
//        HttpServletRequest request = context.getRequest();
//        String user = request.getParameter("user");
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String uri = request.getRequestURI();
        //如果有user代表用户已登录，不用拦截，反之拦截
        if(uri.contains("/auth")){
            //不执行拦截方法
            return false;

        }
        //执行拦截方法
        return true;
    }

    //执行拦截的方法
    @Override
    public Object run() throws ZuulException {
        System.out.println("拦截方法");
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getHeader("token");
        if(!StringUtils.isEmpty(token) && JwtUitl.verify(token)){
            //登录过的用户，放行
            return null;
        }
        System.out.println("你还没有登录");
        context.setSendZuulResponse(false);
        try {
            context.setResponseBody(new ObjectMapper().writeValueAsString(
                    new ResponseResultSet(401,"你还没有登录",null)
            ));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //放行
        return null;
    }
}
